#!/usr/bin/python
# -*- coding: iso-8859-15 -*-

import commands
import re


class IwCfg:
    """
    Classe permettant de recuperer les infos depuis iwconfig
    """
    def __init__(self,session):
        """
        Fonction d'initialisation
        Toutes les variables sont initialises a vide
        """
        self.session=session
        self.u=""
        self.result={}
        self.regex=""
        self.result_regex=""

    def iwcfg(self,param):
        """
        Cette fonction lance iwconfig, et parse le resultat.
        On y recupere
            - Le mode (a-b-g)
            - L'ESSID
            - Le mode (Master, Ad Hoc, ...)
            - La frequence (On pourrait la convertir en canal ???) - perso le canal me parle plus que la freqence !
            - L'adresse MAC de l'AP
            - ...
        """
        # Lancement de la commande avec les droits administrateur
	# 21/09/2009 - SebC - Non necessaire pour un simple parse
        self.u=commands.getoutput('/sbin/iwconfig ' +str(param))
        ## RECUPERATION des parametres
        if re.search('802.11',self.u):
            self.regex=re.compile('(802.11)([abg]{1})')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('ESSID',self.u):    
            self.regex=re.compile('(ESSID)[:|=](.*)  ')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]

        if re.search('Mode',self.u):        
            self.regex=re.compile('(Mode)[:|=]([a-zA-Z]*) ')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Frequency',self.u):
            self.regex=re.compile('(Frequency)[:|=](.* GHz)  ')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Access Point',self.u):
            self.regex=re.compile('(Access Point): ([0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}:[0-9a-fA-F]{2}).*\s*')
            self.result_regex=self.regex.findall(self.u)
            if self.result_regex:
                 self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Bit Rate',self.u):
            self.regex=re.compile('(Bit Rate)[:|=]([0-9\.]{1,4}) [mMkK]{1}b/s.*')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Tx-Power',self.u):
            self.regex=re.compile('(Tx-Power)[:|=]([0-9]{1,3} dBm).*')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Sensitivity',self.u):
            self.regex=re.compile('(Sensitivity)[:|=]([0-9]{1}/[0-9]{1}).*')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Retry',self.u):
            self.regex=re.compile('(Retry:|Retry min limit)[:|=](\d) ')
            self.result_regex=self.regex.findall(self.u)
            #self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('RTS thr',self.u):
            self.regex=re.compile('(RTS thr)[:|=]([onfONF]{2,3}) *')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]

        if re.search('Fragment thr',self.u):
            self.regex=re.compile('(Fragment thr)[:|=]([onfONF|0-9 A-Z]{2,7}) ')
            self.result_regex=self.regex.findall(self.u)
            #self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Encryption key',self.u):
            self.regex=re.compile('(Encryption key)[:|=]([onfONF]{2,3}) *')
            self.result_regex=self.regex.findall(self.u)
            if self.result_regex:
                if self.result_regex[0][1]==( 'ON' or 'on'):
                    #gestion de la crypto
                    self.regex=re.compile('Encryption key[:|=][onON]{2,3} *(.*)Power')
                    self.result_regex=self.regex.findall(self.u)
                    self.result[self.result_regex[0][0]]=self.result_regex[0][1]
                else:
                    self.result[self.result_regex[0][0]]=self.result_regex[0][1]

        if re.search('Power Management',self.u):
            self.regex=re.compile('(Power Management)[:|=]([onfONF]{2,3}) *')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Link Quality',self.u):
            self.regex=re.compile('(Link Quality)[:|=]([0-9]{1,3}/(70|100)) *')
            self.result_regex=self.regex.findall(self.u)
            if self.result_regex:
                self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        # c'est la puissance du signal qui sera utilisé pour l'image finale :
        if re.search('Signal level',self.u):
            self.regex=re.compile('(Signal level)[:|=](-{0,1}[0-9]{1,3} dBm) *')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]

        if re.search('Noise level',self.u):
            self.regex=re.compile('(Noise level)[:|=](-{0,1}[0-9]{1,3} dBm) *')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]

        if re.search('Rx invalid nwid',self.u):
            self.regex=re.compile('(Rx invalid nwid)[:|=]([0-9]{1,3}) *')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Rx invalid crypt',self.u):
            self.regex=re.compile('(Rx invalid crypt)[:|=]([0-9]{1,3}) *')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Rx invalid frag',self.u):
            self.regex=re.compile('(Rx invalid frag)[:|=]([0-9]{1,3}) *')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Tx excessive retries',self.u):
            self.regex=re.compile('(Tx excessive retries)[:|=]([0-9]{1,3}) *')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Invalid misc',self.u):
            self.regex=re.compile('(Invalid misc)[:|=]([0-9]{1,3}) *')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        
        if re.search('Missed beacon',self.u):
            self.regex=re.compile('(Missed beacon)[:|=]([0-9]{1,3}) *')
            self.result_regex=self.regex.findall(self.u)
            self.result[self.result_regex[0][0]]=self.result_regex[0][1]
        # tout ces resultats sont stockés sous formes de dico et renvoyé pour la BDD
        return self.result

